# 调用 re.match, re.search或者对re.finditer结果进行遍历，拿到的内容都是re.Match类型对象
import re

# .任意字符 * 出现任意次数 贪婪模式
m = re.search(r'm.*a', 'ssdasdssdmsajaf')    # <re.Match object; span=(9, 10), match='m'>
# print(dir(m))   # 获取属性和方法
# print(m.pos, m.endpos)    # 从哪开始匹配
print(m.span()) # (9, 14)   匹配到的结果字符串的开始和结束下标

# 使用group方法获取匹配的字符串结果
print(m.group())    # msaja
print(m.group(0))   # msaja
# print(m.group(1)) # IndexError: no such group

# 正则表达式里的group分组方法
# 1、在正则表达式里使用（）表示一个分组
# 2、如果没有分组，默认只有一组
# 3、分组的下标从0开始

# 正则表达式有 四个 分组
m1 = re.search(r'(1.*)(2.*)(3.*4)', 'sda1dbdbf2dshf3jha4kjajkop')
print(m1)   # <re.Match object; span=(3, 19), match='1dbdbf2dshf3jha4'>
print(m1.group(0))  # 第 0 组就是把整个正则表达式当做一个整体：(1.*)(2.*)(3.*4)
print(m1.group())   # 默认就是拿第 0 组
print(m1.group(1))  # 1dbdbf
print(m1.group(2))  # 2dshf

print(m1.groups())  # ('1dbdbf', '2dshf', '3jha4')
# groupdict 作用是获取到分组组成的字典
# print(m1.groupdict())   # {}

# (?P<name>表达式) 可以给分组起一个名字
m2 = re.search(r'(1.*)(?P<abc>2.*)(3.*4)', 'sda1dbdbf2dshf3jha4kjajkop')
# print(m2.groupdict())   # {'abc': '2dshf'}
print(m2.groupdict('abc'))   # {'abc': '2dshf'}
# 可以通过分组名或分组名的下标获取分组里匹配到的字符串
print(m2.group('abc'))  # 2dshf
print(m2.group(2))  # 2dshf


